import sys
import os
import time

# 获取项目根目录的绝对路径（当前文件是examples/main.py，所以上一级是根目录）
root_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(root_path)

from core.data_parser import DataParser
from core.cache_retry import DataCache
from core.monitor import DataMonitor

def main():
    # 1. 初始化模块
    try:
        parser = DataParser()  # 解析模块
        cache = DataCache()    # 缓存模块
        monitor = DataMonitor(log_interval=20)  # 监控（20秒输出一次）
        monitor.start()  # 启动监控
    except Exception as e:
        print(f"模块初始化失败：{e}")
        return

    # 2. 模拟边缘设备发送的数据
    test_data = [
        # 第1条：传感器JSON
        (b'{"temperature": 25.3, "humidity": 60, "device_id": "sensor_001"}', "sensor_json"),
        # 第2条：CSV日志
        (b'2024-10-30 10:00,sensor_001,25.3\n2024-10-30 10:01,sensor_002,26.1', "csv_log"),
        # 第3条：图像二进制
        (b'\x89PNG...', "image_binary")
    ]

    # 3. 处理数据（解析→缓存→模拟断网后转发）
    print("开始处理数据...")
    for raw_data, data_type in test_data:
        # 统计：接收数据
        monitor.update("data_received")

        # 解析数据
        try:
            parsed = parser.parse(raw_data, data_type)
            monitor.update("parse_success")
            print(f"解析成功：{parsed}")
        except Exception as e:
            monitor.update("parse_fail")
            print(f"解析失败：{e}")
            continue

        # 缓存数据（模拟断网，先存起来）
        try:
            cache.cache_data(parsed)
            monitor.update("cache_added")
        except Exception as e:
            print(f"缓存失败：{e}")
            continue

        time.sleep(2)  # 每处理一条等2秒

    # 4. 模拟网络恢复，重试转发
    print("\n==== 网络恢复，开始转发缓存数据 ====")
    def forward_func(data):
        """模拟转发到云端的函数"""
        time.sleep(1)  # 模拟网络请求耗时
        return True  # 假设转发成功

    try:
        cache.retry_forward(forward_func)
        # 统计：转发成功（实际应在forward_func里根据结果更新，这里简化）
        monitor.update("forward_success")
    except Exception as e:
        print(f"转发失败：{e}")

    # 5. 结束流程
    time.sleep(20)  # 等一次监控日志输出
    monitor.stop()
    print("流程结束")

if __name__ == "__main__":
    main()